package gui.logado.mensagens.receber;

import conexao.Http;
import conexao.HttpData;
import conexao.HttpListener;
import gui.logado.mensagens.FiltraMensagens;
import gui.utilitarias.Comfirma;
import gui.utilitarias.ComfirmaListener;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Vector;
import javax.microedition.lcdui.*;
import net.sourceforge.floggy.persistence.*;
import recados.Recados;

public class CaixaEntrada extends List implements CommandListener, HttpListener, ComfirmaListener {

    private final Recados midlet;
    private final Command cmdAtualizar;
    private final Command cmdVoltar;
    private final Command cmdExcluir;
    private final Vector ids;
    //private final Vector msgs;
    private int contador = 0;
    private int naolidas = 0;
    private Http http;
    private final Command cmdParar;
    private final Command cmdDetalhes;
    private Image icone_lida;
    private Image icone_naolida;

    public CaixaEntrada(Recados midlet) {
        super("Caixa Entrada", IMPLICIT);

        this.midlet = midlet;

        cmdVoltar = new Command("Voltar", Command.BACK, 0);
        cmdAtualizar = new Command("Atualizar", Command.SCREEN, 1);
        cmdExcluir = new Command("Apagar", Command.SCREEN, 2);
        cmdParar = new Command("Parar", Command.STOP, 3);
        cmdDetalhes = new Command("Detalhes", Command.SCREEN, 4);

        addCommand(cmdVoltar);
        addCommand(cmdAtualizar);

        setCommandListener(this);

        ids = new Vector(1);

        // msgs = new Vector(1);

        try {
            icone_lida = Image.createImage("/gui/logado/mensagens/receber/lida.png");
            icone_naolida = Image.createImage("/gui/logado/mensagens/receber/naolida.png");
        } catch (IOException ex) {
        }

        carregaMemoria();
    }

    private void carregaMemoria() {
        try {
            PersistableManager pm = PersistableManager.getInstance();
            ObjectSet msg = pm.find(Mensagem.class, new FiltraMensagens(midlet.getLoginConfig().getNome()), null);

            Mensagem m;

            for (int i = 0; i < msg.size(); i++) {
                m = (Mensagem) msg.get(i);
                registra(m.getDe(), m.getId(), m.isLida());
            }

        } catch (FloggyException ex) {
            ex.printStackTrace();
        }
    }

    //Adiciona no heap
    private void registra(String de, String id, boolean lida) {
        if (!ids.contains(id)) {
            ids.addElement(id);
            append(de, lida ? icone_lida : icone_naolida);
            if (!lida) {
                incNaoLidas(1);
            }
        }
    }

    public void commandAction(Command c, Displayable d) {
        if (c == cmdVoltar) {
            Recados.setCurrent(midlet.getMensagens());
        } else if (c == cmdAtualizar) {
            run();
        } else if (c == cmdParar) {
            removeCommand(cmdParar);
            addCommand(cmdAtualizar);
        } else if (c == cmdExcluir) {
            Recados.setCurrent(new Deletar());
        } else if (c == cmdDetalhes) {
            String id = (String) ids.elementAt(getSelectedIndex());

            Mensagem tempM = getMensagem(id);

            DetalhesMensagem detalhes = new DetalhesMensagem(tempM, midlet);
            detalhes.setBack(this);
            Recados.setCurrent(detalhes);
        } else if (c == List.SELECT_COMMAND) {
            if (getSelectedIndex() > -1) {
                String id = (String) ids.elementAt(getSelectedIndex());

                ExibeMensagem exibe = new ExibeMensagem(id);
                if (!getMensagem(id).isBaixada()) {
                    new Thread(exibe).start();
                }

                Recados.setCurrent(exibe);
            }
        }
    }

    public void run() {
        http = new Http("Baixando Mensagens");
        HttpData dados = new HttpData();
        http.setHttpData(dados);

        dados.setPagina("/lista_recados.php");
        http.setListener(this);

        dados.put("nome", midlet.getLoginConfig().getNome());
        dados.put("senha", midlet.getLoginConfig().getSenha());

        removeCommand(cmdAtualizar);
        addCommand(cmdParar);

        http.doPost(true);
    }

    public void requisicaoCancelada() {
        removeCommand(cmdParar);
        addCommand(cmdAtualizar);
        Recados.setCurrent(this);
    }

    public void falhaRequisiçao(String mensagem) {
        removeCommand(cmdParar);
        addCommand(cmdAtualizar);
        if (midlet.getConfig().isErros()) {
            Recados.setCurrent(new Alert("Erro", mensagem, null, AlertType.ERROR));
        }
    }

    public void requisicaoConcluida(DataInputStream in) {
        String linha = Http.readLine(in);

        if (linha.equals("erro")) {
            if (isShown() || midlet.getConfig().isErros()) {
                Recados.setCurrent(new Alert("Erro", Http.readLine(in), null, AlertType.ERROR), this);
            }

            removeCommand(cmdParar);
            addCommand(cmdAtualizar);
            return;
        }

        int naolidas_antes = naolidas;

        setNaolidas(0);

        int num_messages = Integer.parseInt(linha);

        setContador(num_messages);

        if (isShown() && num_messages < 1) {
            Recados.setCurrent(new Alert("Erro","Não há mensagens", null, AlertType.ERROR), this);

            removeCommand(cmdParar);
            addCommand(cmdAtualizar);
            return;
        }

        PersistableManager pm = PersistableManager.getInstance();

        for (int i = 0; i < num_messages; i++) {
            try {
                Mensagem tempM = new Mensagem();
                tempM.setBaixada(false);
                tempM.setId(Http.readLine(in));
                tempM.setLida(Http.readLine(in).equals("true"));
                tempM.setData(Http.readLine(in));
                tempM.setDe(Http.readLine(in));
                tempM.setTipo(Http.readLine(in));
                tempM.setNome(Http.readLine(in));

                SingleObjectSet set = pm.find(Mensagem.class, new ProcuraMensagem(tempM.getId()), null);

                if (set.size() < 1) {
                    tempM.salva();
                }

                registra(tempM.getDe(), tempM.getId(), tempM.isLida());

            } catch (FloggyException ex) {
                ex.printStackTrace();
                continue;
            }
        }

        removeCommand(cmdParar);
        addCommand(cmdAtualizar);

        if (contador > 0) {
            addCommand(cmdExcluir);
            addCommand(cmdDetalhes);
        }

        if (naolidas > 0 && naolidas_antes != naolidas) {
            String mensagem;

            if (naolidas > 1) {
                mensagem = "Voçê tem " + naolidas + " novas mensagens";
            } else {
                mensagem = "Voçê tem 1 nova mensagem";
            }

            Comfirma com = new Comfirma(Display.getDisplay(midlet).getCurrent(), "Info", mensagem + ". Ler ?");
            com.setListener(this);
            if (!isShown()) {
                Recados.setCurrent(com);
            }
        }
    }

    //********* Gerencia Mensagems ************ //
    public Mensagem getMensagem(String id) {
        Mensagem tempM = null;
        try {
            ObjectSet mensagems = PersistableManager.getInstance().find(Mensagem.class, new ProcuraMensagem(id), null);

            if (mensagems.size() < 1 && midlet.getConfig().isErros()) {
                Recados.setCurrent(new Alert("Erro", "Mensagem não encontrada", null, AlertType.ERROR), this);
                return null;
            }

            tempM = (Mensagem) mensagems.get(0);
        } catch (FloggyException ex) {
            ex.printStackTrace();
        }

        return tempM;
    }

    public void remove(String id) {
        Mensagem m = getMensagem(id);

        try {
            PersistableManager.getInstance().delete(m);
        } catch (FloggyException ex) {
            Recados.setCurrent(new Alert("Erro", "Problema ao deletar: " + ex.getMessage(), null, AlertType.ERROR), this);
        }

        System.out.println("Renovendo mensagem lida ?: " + m.isLida());
        if (!m.isLida()) {
            incNaoLidas(-1);
        }

        delete(ids.indexOf(id));
        ids.removeElement(id);

        incContador(-1);

        if (size() < 1) {
            removeCommand(cmdExcluir);
            removeCommand(cmdDetalhes);
        }
    }

    public void setLida(String id) {
        Mensagem m = getMensagem(id);

        if (m.isLida()) {
            return;
        }

        m.setLida(true);
        m.salva();

        set(ids.indexOf(id), m.getDe(), icone_lida);

        incNaoLidas(-1);
    }

    public String getId(int index) {
        return (String) ids.elementAt(index);
    }

    /////*********************************************************/
    public int getContador() {
        return contador;
    }

    public void setContador(int contador) {
        this.contador = contador;

        midlet.getPrincipal().set(0, "Mensagens (" + naolidas + "/" + this.contador + ")", midlet.getPrincipal().getImage(0));
        midlet.getMensagens().set(1, "Caixa de Entrada (" + naolidas + "/" + this.contador + ")", midlet.getMensagens().getImage(1));
    }

    public int getNaolidas() {
        return naolidas;
    }

    public void setNaolidas(int naolidas) {
        this.naolidas = naolidas;

        midlet.getPrincipal().set(0, "Mensagens (" + naolidas + "/" + contador + ")", midlet.getPrincipal().getImage(0));
        midlet.getMensagens().set(1, "Caixa de Entrada (" + naolidas + "/" + contador + ")", midlet.getMensagens().getImage(1));
    }

    public void incContador(int inc) {
        this.contador += inc;

        midlet.getPrincipal().set(0, "Mensagens (" + naolidas + "/" + contador + ")", midlet.getPrincipal().getImage(0));
        midlet.getMensagens().set(1, "Caixa de Entrada (" + naolidas + "/" + contador + ")", midlet.getMensagens().getImage(1));
    }

    public void incNaoLidas(int inc) {
        this.naolidas += inc;
        midlet.getPrincipal().set(0, "Mensagens (" + naolidas + "/" + contador + ")", midlet.getPrincipal().getImage(0));
        midlet.getMensagens().set(1, "Caixa de Entrada (" + naolidas + "/" + contador + ")", midlet.getMensagens().getImage(1));
    }

    public void retornoComfirma(int id, int escolha) {
        if (escolha == Comfirma.SIM) {
            Recados.setCurrent(this);
        }
    }
}
